﻿-------------------------------------------------------------------------------------------------------
-----------------------------------pca_ventas.nombre_campo_adicional-----------------------------------
-------------------------------------------------------------------------------------------------------
CREATE OR REPLACE FUNCTION pca_ventas.fn_get_configuracion_campo_adicional(varchar --campo_id $1
									   )RETURNS SETOF pca_ventas.configuracion_campo_adicional AS
$$
DECLARE
	_row pca_ventas.configuracion_campo_adicional%ROWTYPE;
BEGIN
	FOR _row IN
		SELECT
			campo_id,
			nombre,
			visible
		FROM
			pca_ventas.configuracion_campo_adicional
		WHERE
			campo_id=$1
	LOOP
		RETURN NEXT _row;
	END LOOP;
END;
$$
LANGUAGE plpgsql;

-------------------------------------------------------------------------------------------------------
-------------------------------------pca_ventas.comprobantes-------------------------------------------
-------------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION pca_ventas.fn_existe_comprobante(varchar,--oficina_id $1
							    varchar,--empresa_id $2
							    varchar,--documento_id $3
							    integer,--serie $4
							    integer --numero $5
							    )RETURNS boolean AS
$$
DECLARE
	_comprobante_id bigint;
BEGIN
	SELECT 
		comprobante_id 
	INTO
		_comprobante_id
	FROM 
		pca_ventas.comprobantes 
	WHERE 
		oficina_id = $1 AND
		empresa_id = $2 AND
		documento_id = $3 AND
		serie = $4 AND
		numero = $5 AND
		estado_comprobante_id <> '00' AND
		estado_comprobante_id <> '02';

	IF(FOUND)THEN
		RETURN true;
	ELSE
		RETURN false;
	END IF;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_ventas.fn_add_borrador(bigint,--sesion_id $1
						      varchar,--oficina_id $2
						      varchar,--empresa_id $3
						      varchar --documento_id $4
						      )RETURNS bigint AS
$$
DECLARE
	_precios_incluyen_igv pca_ventas.comprobantes.precios_incluyen_igv%TYPE;
	_val_igv pca_ventas.comprobantes.val_igv%TYPE;
	_moneda_id pca_ventas.comprobantes.moneda_id%TYPE;
	_tipo_cambio_emision pca_ventas.comprobantes.tipo_cambio_emision%TYPE;
BEGIN
	_precios_incluyen_igv := pca.fn_get_precios_inc_igv($2,$3);
	_val_igv := pca.fn_get_val_igv($2,$3);
	_moneda_id := pca.fn_get_moneda_default($2,$3);
	_tipo_cambio_emision := pca.fn_get_tipo_cambio_ventas($2,$3);

	INSERT INTO pca_ventas.comprobantes
		(sesion_id,
		 oficina_id,
		 empresa_id,
		 documento_id,
		 serie,
		 numero,
		 nombre_cliente,
		 plazo_id,
		 fecha_hora_emision,
		 fecha_hora_vencimiento,
		 precios_incluyen_igv,
		 val_igv,
		 moneda_id,
		 estado_comprobante_id,
		 tipo_cambio_emision)
	VALUES
		($1,$2,$3,$4,0,0,'','01',current_timestamp,current_timestamp,_precios_incluyen_igv,_val_igv,_moneda_id,'00',_tipo_cambio_emision);

	RETURN pca_global.fn_pseudo_encrypt_bigint(currval('pca_ventas.seq_comprobante_id')::integer);
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_ventas.fn_add_comprobante(bigint,--sesion_id $1 
							 varchar,--oficina_id $2
							 varchar,--empresa_id $3
							 varchar,--documento_id $4
							 integer,--serie $5
							 integer,--numero $6
							 bigint,--cliente_id $7
							 varchar,--num_doc_identidad $8
							 varchar,--nombre_cliente $9
							 varchar,--direccion_cliente $10 
							 varchar,--plazo_id $11
							 timestamp with time zone,--fecha_hora_emision $12
							 timestamp with time zone,--fecha_hora_vencimiento $13 
							 boolean,--precios_incluyen_igv $14
							 numeric,--val_igv $15
							 varchar,--moneda_id $16
							 numeric,--importe_bruto $17 
							 numeric,--descuento $18
							 numeric,--valor_venta $19
							 numeric,--impuesto $20
							 numeric,--precio_venta $21
							 numeric,--total_pagos $22
							 varchar,--estado_comprobante_id $23
							 numeric,--tipo_cambio_emision $24
							 text,--adicional1 $25
							 text,--adicional2 $26
							 text,--adicional3 $27
							 text --adicional4 $28
							 )RETURNS bigint AS
$$
BEGIN
	INSERT INTO pca_ventas.comprobantes
		(sesion_id,
		oficina_id,
		empresa_id,
		documento_id,
		serie,
		numero,
		cliente_id,
		num_doc_identidad,
		nombre_cliente,
		direccion_cliente,
		plazo_id,
		fecha_hora_emision,
		fecha_hora_vencimiento,
		precios_incluyen_igv,
		val_igv,
		moneda_id,
		importe_bruto,
		descuento,
		valor_venta,
		impuesto,
		precio_venta,
		total_pagos,
		estado_comprobante_id,
		tipo_cambio_emision,
		adicional1,
		adicional2,
		adicional3,
		adicional4)
	VALUES
		($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28);

	RETURN pca_global.fn_pseudo_encrypt_bigint(currval('pca_ventas.seq_comprobante_id')::integer);
END;
$$
LANGUAGE plpgsql;
			
CREATE OR REPLACE FUNCTION pca_ventas.fn_update_comprobante(bigint,--comprobante_id $1
							    bigint,--sesion_id $2
							    varchar,--oficina_id $3
							    varchar,--empresa_id $4
							    varchar,--documento_id $5
							    integer,--serie $6
							    integer,--numero $7
							    bigint,--cliente_id $8
							    varchar,--num_doc_identidad $9
							    varchar,--nombre_cliente $10
							    varchar,--direccion_cliente $11
							    varchar,--plazo_id $12
							    timestamp with time zone,--fecha_hora_emision $13
							    timestamp with time zone,--fecha_hora_vencimiento $14
							    varchar,--moneda_id $15
							    numeric,--tipo_cambio_emision $16
							    text,--adicional1 $17
							    text,--adicional2 $18
							    text, --adicional3 $19
							    text --adicional4 $20
							    )RETURNS void AS
$$
BEGIN
	UPDATE pca_ventas.comprobantes SET
		sesion_id = $2,
		oficina_id = $3,
		empresa_id = $4,
		documento_id = $5,
		serie = $6,
		numero = $7,
		cliente_id = $8,
		num_doc_identidad = $9,
		nombre_cliente = $10,
		direccion_cliente = $11,
		plazo_id = $12,
		fecha_hora_emision = $13,
		fecha_hora_vencimiento = $14,
		moneda_id = $15,
		tipo_cambio_emision = $16,
		adicional1 = $17,
		adicional2 = $18,
		adicional3 = $19,
		adicional4 = $20
	WHERE
		comprobante_id = $1;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_ventas.fn_update_precios_incluyen_igv_comprobante(bigint, --comprobante_id $1
										 boolean --precios_incluyen_igv $2
										 )RETURNS void AS
$$
DECLARE
	_row pca_ventas.comprobantes%ROWTYPE;
	_importe_bruto pca_ventas.comprobantes.importe_bruto%TYPE;
	_descuento pca_ventas.comprobantes.descuento%TYPE;
	_valor_venta pca_ventas.comprobantes.valor_venta%TYPE;
	_impuesto pca_ventas.comprobantes.impuesto%TYPE;
	_precio_venta pca_ventas.comprobantes.precio_venta%TYPE;
BEGIN
	SELECT
		*
	INTO
		_row
	FROM
		pca_ventas.comprobantes
	WHERE
		comprobante_id = $1;

	_descuento := _row.descuento;
	_importe_bruto := _row.importe_bruto;

	IF(FOUND)THEN
		IF(_row.precios_incluyen_igv <> $2)THEN --Actualizar solo si el nuevo valor es diferente
			IF($2)THEN --si incluyen IGV
				_precio_venta := _importe_bruto - _descuento;
				_valor_venta := _precio_venta / (1+ (_row.val_igv/100));
			ELSE --no incluyen IGV
				_valor_venta := _importe_bruto - _descuento;
				_precio_venta := _valor_venta * (1+ (_row.val_igv/100));
			END IF;

			_impuesto :=  _precio_venta - _valor_venta;

			UPDATE pca_ventas.comprobantes SET
				precios_incluyen_igv = $2,
				valor_venta = _valor_venta,
				impuesto = _impuesto,
				precio_venta = _precio_venta
			WHERE
				comprobante_id = $1;
		END IF;
	ELSE
		RAISE EXCEPTION 'No existe comprobante con ID = %',$1;
	END IF;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_ventas.fn_del_comprobantes(bigint --comprobante_id $1
							  )RETURNS void AS
$$
BEGIN
	DELETE FROM pca_ventas.comprobantes WHERE comprobante_id = $1;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_ventas.fn_descartar_borradores(ids bigint[]
							      )RETURNS void AS
$$
DECLARE
	i integer; --puntero para recorrer los IDS
	numregistros integer;
BEGIN
	numregistros := array_upper(ids,1);
	i := 1;

	WHILE i <= numregistros 
	LOOP
		DELETE FROM pca_ventas.comprobantes WHERE comprobante_id = ids[i] AND estado_comprobante_id='00';
		i = i + 1;
	END LOOP;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_ventas.fn_eliminar_papelera(ids bigint[]
							   )RETURNS void AS
$$
DECLARE
	i integer; --puntero para recorrer los IDS
	numregistros integer;
BEGIN
	numregistros := array_upper(ids,1);
	i := 1;

	WHILE i <= numregistros 
	LOOP
		DELETE FROM pca_ventas.comprobantes WHERE comprobante_id = ids[i] AND estado_comprobante_id='02';
		i = i + 1;
	END LOOP;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_ventas.fn_update_estado_comprobante(bigint,--comprobante_id $1
								   varchar --estado_comprobante_id $2
								   )RETURNS void AS
$$
BEGIN
	UPDATE pca_ventas.comprobantes SET
		estado_comprobante_id=$2
	WHERE
		comprobante_id=$1;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_ventas.fn_get_comprobante(bigint --comprobante_id $1
							 )RETURNS SETOF pca_ventas.vw_comprobantes AS
$$
DECLARE
	_row pca_ventas.vw_comprobantes%ROWTYPE;
BEGIN
	FOR _row IN
		SELECT
			comprobante_id,
			sesion_id,
			usuario_id,
			oficina_id,
			empresa_id,
			documento_id,
			documento,
			serie,
			numero,
			strserienumero,
			cliente_id,
			num_doc_identidad,
			nombre_cliente,
			direccion_cliente,
			plazo_id,
			plazo,
			fecha_hora_emision,
			fecha_hora_vencimiento,
			fecha_hora_sistema,
			precios_incluyen_igv,
			val_igv,
			moneda_id,
			moneda,
			moneda_siglas,
			importe_bruto,
			descuento,
			valor_venta,
			impuesto,
			precio_venta,
			total_pagos,
			total_deuda,
			estado_comprobante_id,
			tipo_cambio_emision,
			adicional1,
			adicional2,
			adicional3,
			adicional4
		FROM
			pca_ventas.vw_comprobantes
		WHERE
			comprobante_id =$1
	LOOP
		RETURN NEXT _row;
	END LOOP;
END;
$$
LANGUAGE plpgsql;

----------------------------------Consultar Borradores---------------------------------------------

CREATE OR REPLACE FUNCTION pca_ventas.fn_get_list_comprobantes_borrador(integer,--start $1
									integer,--limit $2
									varchar,--oficina_id $3
									varchar,--empresa_id $4
									varchar,--documento_id $5
									varchar --usuario_id $6
									)RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
BEGIN
	OPEN cursor_result FOR
		SELECT
			comprobante_id,
			sesion_id,
			usuario_id,
			oficina_id,
			empresa_id,
			documento_id,
			documento,
			serie,
			numero,
			strserienumero,
			cliente_id,
			num_doc_identidad,
			nombre_cliente,
			direccion_cliente,
			plazo_id,
			plazo,
			fecha_hora_emision,
			fecha_hora_vencimiento,
			fecha_hora_sistema,
			precios_incluyen_igv,
			val_igv,
			moneda_id,
			moneda,
			moneda_siglas,
			importe_bruto,
			descuento,
			valor_venta,
			impuesto,
			precio_venta,
			total_pagos,
			total_deuda,
			estado_comprobante_id,
			tipo_cambio_emision,
			adicional1,
			adicional2,
			adicional3,
			adicional4
		FROM
			pca_ventas.vw_comprobantes
		WHERE
			estado_comprobante_id = '00' AND
			oficina_id = $3 AND
			empresa_id = $4 AND
			documento_id =$5 AND
			usuario_id = $6
		ORDER BY
			serie DESC,numero DESC LIMIT $2 OFFSET $1;
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		SELECT
			count(comprobante_id)
		FROM
			pca_ventas.vw_comprobantes
		WHERE
			estado_comprobante_id = '00' AND
			oficina_id = $3 AND
			empresa_id = $4 AND
			documento_id =$5 AND
			usuario_id = $6;
	RETURN NEXT cursor_totalrows;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_ventas.fn_get_list_comprobantes_borrador(integer,--start $1
									integer,--limit $2
									varchar,--oficina_id $3
									varchar,--empresa_id $4
									varchar,--documento_id $5
									varchar,--usuario_id $6
									varchar[]--filtros $7
									)RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
	sqlfiltro varchar;
	sqlcount varchar;
BEGIN
	$7 := $7 || ARRAY[['string','eq','00','estado_comprobante_id'],['string','eq',$3,'oficina_id'],['string','eq',$4,'empresa_id'],['string','eq',$5,'documento_id'],['string','eq',$6,'usuario_id']]::varchar[];
	
	sqlfiltro := 
		'SELECT
			comprobante_id,
			sesion_id,
			usuario_id,
			oficina_id,
			empresa_id,
			documento_id,
			documento,
			serie,
			numero,
			strserienumero,
			cliente_id,
			num_doc_identidad,
			nombre_cliente,
			direccion_cliente,
			plazo_id,
			plazo,
			fecha_hora_emision,
			fecha_hora_vencimiento,	
			fecha_hora_sistema,
			precios_incluyen_igv,
			val_igv,
			moneda_id,
			moneda,
			moneda_siglas,
			importe_bruto,
			descuento,
			valor_venta,
			impuesto,
			precio_venta,
			total_pagos,
			total_deuda,
			estado_comprobante_id,
			tipo_cambio_emision,
			adicional1,
			adicional2,
			adicional3,
			adicional4
		FROM
			pca_ventas.vw_comprobantes
		WHERE '|| pca_global.fn_get_strfiltro($7) ||
		' ORDER BY
			serie DESC,numero DESC LIMIT '|| $2 || ' OFFSET '|| $1;
			
	sqlcount :=
		'SELECT
			count(comprobante_id)
		FROM
			pca_ventas.vw_comprobantes
		WHERE '|| pca_global.fn_get_strfiltro($7);

	OPEN cursor_result FOR
		EXECUTE(sqlfiltro);
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		EXECUTE(sqlcount);
	RETURN NEXT cursor_totalrows;
END;
$$
LANGUAGE plpgsql;

--------------------------------------Consultar activos------------------------------------------------
CREATE OR REPLACE FUNCTION pca_ventas.fn_get_list_comprobantes_activos(integer,--start $1
								       integer,--limit $2
								       varchar,--oficina_id $3
								       varchar,--empresa_id $4
								       varchar --documento_id $5
								       )RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
BEGIN
	OPEN cursor_result FOR
		SELECT
			comprobante_id,
			sesion_id,
			usuario_id,
			oficina_id,
			empresa_id,
			documento_id,
			documento,
			serie,
			numero,
			strserienumero,
			cliente_id,
			num_doc_identidad,
			nombre_cliente,
			direccion_cliente,
			plazo_id,
			plazo,
			fecha_hora_emision,
			fecha_hora_vencimiento,	
			fecha_hora_sistema,
			precios_incluyen_igv,
			val_igv,
			moneda_id,
			moneda,
			moneda_siglas,
			importe_bruto,
			descuento,
			valor_venta,
			impuesto,
			precio_venta,
			total_pagos,
			total_deuda,
			estado_comprobante_id,
			tipo_cambio_emision,
			adicional1,
			adicional2,
			adicional3,
			adicional4
		FROM
			pca_ventas.vw_comprobantes
		WHERE
			estado_comprobante_id <> '00' AND
			estado_comprobante_id <> '02' AND
			oficina_id = $3 AND
			empresa_id = $4 AND
			documento_id =$5
		ORDER BY
			serie DESC,numero DESC LIMIT $2 OFFSET $1;
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		SELECT
			count(comprobante_id)
		FROM
			pca_ventas.vw_comprobantes
		WHERE
			estado_comprobante_id <> '00' AND
			estado_comprobante_id <> '02' AND
			oficina_id = $3 AND
			empresa_id = $4 AND
			documento_id =$5;
	RETURN NEXT cursor_totalrows;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_ventas.fn_get_list_comprobantes_activos(integer,--start $1
								       integer,--limit $2
								       varchar,--oficina_id $3
								       varchar,--empresa_id $4
								       varchar,--documento_id $5
								       varchar[]--filtros $6
								       )RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
	sqlfiltro varchar;
	sqlcount varchar;
BEGIN
	$6 := $6 || ARRAY[['string','df','00','estado_comprobante_id'],['string','df','02','estado_comprobante_id'],['string','eq',$3,'oficina_id'],['string','eq',$4,'empresa_id'],['string','eq',$5,'documento_id']]::varchar[];

	sqlfiltro := 
		'SELECT
			comprobante_id,
			sesion_id,
			usuario_id,
			oficina_id,
			empresa_id,
			documento_id,
			documento,
			serie,
			numero,
			strserienumero,
			cliente_id,
			num_doc_identidad,
			nombre_cliente,
			direccion_cliente,
			plazo_id,
			plazo,
			fecha_hora_emision,
			fecha_hora_vencimiento,	
			fecha_hora_sistema,
			precios_incluyen_igv,
			val_igv,
			moneda_id,
			moneda,
			moneda_siglas,
			importe_bruto,
			descuento,
			valor_venta,
			impuesto,
			precio_venta,
			total_pagos,
			total_deuda,
			estado_comprobante_id,
			tipo_cambio_emision,
			adicional1,
			adicional2,
			adicional3,
			adicional4
		FROM
			pca_ventas.vw_comprobantes
		WHERE '|| pca_global.fn_get_strfiltro($6) ||
		' ORDER BY
			serie DESC,numero DESC LIMIT '|| $2 || ' OFFSET '|| $1;
			
	sqlcount :=
		'SELECT
			count(comprobante_id)
		FROM
			pca_ventas.vw_comprobantes
		WHERE '|| pca_global.fn_get_strfiltro($6);

	OPEN cursor_result FOR
		EXECUTE(sqlfiltro);
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		EXECUTE(sqlcount);
	RETURN NEXT cursor_totalrows;
END;
$$
LANGUAGE plpgsql;

--------------------------------------Consultar eliminados------------------------------------------------

CREATE OR REPLACE FUNCTION pca_ventas.fn_get_list_comprobantes_eliminados(integer,--start $1
									  integer,--limit $2
									  varchar,--oficina_id $3
									  varchar,--empresa_id $4
									  varchar --documento_id $5
									  )RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
BEGIN
	OPEN cursor_result FOR
		SELECT
			comprobante_id,
			sesion_id,
			usuario_id,
			oficina_id,
			empresa_id,
			documento_id,
			documento,
			serie,
			numero,
			strserienumero,
			cliente_id,
			num_doc_identidad,
			nombre_cliente,
			direccion_cliente,
			plazo_id,
			plazo,
			fecha_hora_emision,
			fecha_hora_vencimiento,	
			fecha_hora_sistema,
			precios_incluyen_igv,
			val_igv,
			moneda_id,
			moneda,
			moneda_siglas,
			importe_bruto,
			descuento,
			valor_venta,
			impuesto,
			precio_venta,
			total_pagos,
			total_deuda,
			estado_comprobante_id,
			tipo_cambio_emision,
			adicional1,
			adicional2,
			adicional3,
			adicional4
		FROM
			pca_ventas.vw_comprobantes
		WHERE
			estado_comprobante_id = '02' AND
			oficina_id = $3 AND
			empresa_id = $4 AND
			documento_id =$5
		ORDER BY
			serie DESC,numero DESC LIMIT $2 OFFSET $1;
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		SELECT
			count(comprobante_id)
		FROM
			pca_ventas.vw_comprobantes
		WHERE
			estado_comprobante_id = '02' AND
			oficina_id = $3 AND
			empresa_id = $4 AND
			documento_id =$5;
	RETURN NEXT cursor_totalrows;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_ventas.fn_get_list_comprobantes_eliminados(integer,--start $1
									  integer,--limit $2
									  varchar,--oficina_id $3
									  varchar,--empresa_id $4
								          varchar,--documento_id $5
									  varchar[]--filtros $6
									  )RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
	sqlfiltro varchar;
	sqlcount varchar;
BEGIN
	$6 := $6 || ARRAY[['string','eq','02','estado_comprobante_id'],['string','eq',$3,'oficina_id'],['string','eq',$4,'empresa_id'],['string','eq',$5,'documento_id']]::varchar[];
	sqlfiltro := 
		'SELECT
			comprobante_id,
			sesion_id,
			usuario_id,
			oficina_id,
			empresa_id,
			documento_id,
			documento,
			serie,
			numero,
			strserienumero,
			cliente_id,
			num_doc_identidad,
			nombre_cliente,
			direccion_cliente,
			plazo_id,
			plazo,
			fecha_hora_emision,
			fecha_hora_vencimiento,
			fecha_hora_sistema,
			precios_incluyen_igv,
			val_igv,
			moneda_id,
			moneda,
			moneda_siglas,
			importe_bruto,
			descuento,
			valor_venta,
			impuesto,
			precio_venta,
			total_pagos,
			total_deuda,
			estado_comprobante_id,
			tipo_cambio_emision,
			adicional1,
			adicional2,
			adicional3,
			adicional4
		FROM
			pca_ventas.vw_comprobantes
		WHERE '|| pca_global.fn_get_strfiltro($6) ||
		' ORDER BY
			serie DESC,numero DESC LIMIT '|| $2 || ' OFFSET '|| $1;
			
	sqlcount :=
		'SELECT
			count(comprobante_id)
		FROM
			pca_ventas.vw_comprobantes
		WHERE '|| pca_global.fn_get_strfiltro($6);

	OPEN cursor_result FOR
		EXECUTE(sqlfiltro);
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		EXECUTE(sqlcount);
	RETURN NEXT cursor_totalrows;
END;
$$
LANGUAGE plpgsql;

-------------------------------------------------------------------------------------------------------
------------------------------pca_ventas.detalles_comprobante--------------------------------------
-------------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION pca_ventas.fn_add_detalle(bigint,--sesion_id $1
						     bigint,--comprobante_id $2
						     bigint,--articulo_id $3
						     varchar,--codigo $4
						     numeric,--cantidad $5
						     varchar,--medida $6
						     text,--descripcion $7
						     numeric,--precio_unitario $8
						     numeric --precio_costo $9
						     )RETURNS bigint AS
$$
DECLARE
	_row pca_ventas.comprobantes%ROWTYPE;
	_importe_bruto pca_ventas.comprobantes.importe_bruto%TYPE;
	_descuento pca_ventas.comprobantes.descuento%TYPE;
	_valor_venta pca_ventas.comprobantes.valor_venta%TYPE;
	_impuesto pca_ventas.comprobantes.impuesto%TYPE;
	_precio_venta pca_ventas.comprobantes.precio_venta%TYPE;

	_precio_total pca_ventas.detalles_comprobante.precio_total%TYPE;
BEGIN
	SELECT
		*
	INTO
		_row
	FROM
		pca_ventas.comprobantes
	WHERE
		comprobante_id = $2;

	IF(FOUND)THEN
		_precio_total = $5 * $8; --calculamos el total para el detalle = cantidad * precio_unitario
	
		_descuento := _row.descuento;
		_importe_bruto := _row.importe_bruto + _precio_total;

		IF(_row.precios_incluyen_igv)THEN
			_precio_venta := _importe_bruto - _descuento;
			_valor_venta := _precio_venta / (1+ (_row.val_igv/100));
		ELSE
			_valor_venta := _importe_bruto - _descuento;
			_precio_venta := _valor_venta * (1+ (_row.val_igv/100));
		END IF;
		
		_impuesto :=  _precio_venta - _valor_venta;

		UPDATE pca_ventas.comprobantes SET
			importe_bruto = _importe_bruto,
			valor_venta = _valor_venta,
			impuesto = _impuesto,
			precio_venta = _precio_venta
		WHERE
			comprobante_id = $2;

		INSERT INTO pca_ventas.detalles_comprobante
			(sesion_id,
			comprobante_id,
			articulo_id,
			codigo,
			cantidad,
			medida,
			descripcion,
			precio_unitario,
			precio_costo,
			precio_total)
		VALUES
			($1,$2,$3,$4,$5,$6,$7,$8,$9,_precio_total);

		RETURN pca_global.fn_pseudo_encrypt_bigint(currval('pca_ventas.seq_detalle_id')::integer);
	ELSE
		RAISE EXCEPTION 'No existe comprobante con ID = %',$2;
	END IF;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_ventas.fn_update_detalle(bigint,--detalle_id $1
							bigint,--sesion_id $2
							bigint,--comprobante_id $3
							bigint,--articulo_id $4
							varchar,--codigo $5
							numeric,--cantidad $6
							varchar,--medida $7
							text,--descripcion $8
							numeric,--precio_unitario $9
							numeric --precio_costo $10
							)RETURNS void AS
$$
DECLARE
	_row pca_ventas.comprobantes%ROWTYPE;
	_rowdetalle pca_ventas.detalles_comprobante%ROWTYPE;
	_importe_bruto pca_ventas.comprobantes.importe_bruto%TYPE;
	_descuento pca_ventas.comprobantes.descuento%TYPE;
	_valor_venta pca_ventas.comprobantes.valor_venta%TYPE;
	_impuesto pca_ventas.comprobantes.impuesto%TYPE;
	_precio_venta pca_ventas.comprobantes.precio_venta%TYPE;

	_precio_total pca_ventas.detalles_comprobante.precio_total%TYPE;
BEGIN
	SELECT
		*
	INTO
		_rowdetalle
	FROM
		pca_ventas.detalles_comprobante
	WHERE
		detalle_id = $1;

	IF(FOUND)THEN
		SELECT
			*
		INTO
			_row
		FROM
			pca_ventas.comprobantes
		WHERE
			comprobante_id = $3;
			
		IF(FOUND)THEN
			_precio_total = $6 * $9; --calculamos el total para el detalle = cantidad * precio_unitario
		
			_descuento := _row.descuento;
			_importe_bruto := (_row.importe_bruto - _rowdetalle.precio_total) + _precio_total;

			IF(_row.precios_incluyen_igv)THEN
				_precio_venta := _importe_bruto - _descuento;
				_valor_venta := _precio_venta / (1+ (_row.val_igv/100));
			ELSE
				_valor_venta := _importe_bruto - _descuento;
				_precio_venta := _valor_venta * (1+ (_row.val_igv/100));
			END IF;
		
			_impuesto :=  _precio_venta - _valor_venta;

			UPDATE pca_ventas.comprobantes SET
				importe_bruto = _importe_bruto,
				valor_venta = _valor_venta,
				impuesto = _impuesto,
				precio_venta = _precio_venta
			WHERE
				comprobante_id = $3;

			UPDATE pca_ventas.detalles_comprobante SET
				sesion_id = $2,
				comprobante_id = $3,
				articulo_id = $4,
				codigo = $5,
				cantidad = $6,
				medida = $7,
				descripcion = $8,
				precio_unitario = $9,
				precio_costo = $10,
				precio_total = _precio_total
			WHERE
				detalle_id = $1;
		ELSE
			RAISE EXCEPTION 'No existe comprobante con ID = %',$3;
		END IF;
	ELSE
		RAISE EXCEPTION 'No existe detalle con ID = %',$1;
	END IF;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_ventas.fn_del_detalle_comprobante(bigint --detalle_id $1
								 )RETURNS void AS
$$
DECLARE
	_row pca_ventas.comprobantes%ROWTYPE;
	_rowdetalle pca_ventas.detalles_comprobante%ROWTYPE;
	_importe_bruto pca_ventas.comprobantes.importe_bruto%TYPE;
	_descuento pca_ventas.comprobantes.descuento%TYPE;
	_valor_venta pca_ventas.comprobantes.valor_venta%TYPE;
	_impuesto pca_ventas.comprobantes.impuesto%TYPE;
	_precio_venta pca_ventas.comprobantes.precio_venta%TYPE;
BEGIN
	SELECT
		*
	INTO
		_rowdetalle
	FROM
		pca_ventas.detalles_comprobante
	WHERE
		detalle_id = $1;

	IF(FOUND)THEN
		SELECT
			*
		INTO
			_row
		FROM
			pca_ventas.comprobantes
		WHERE
			comprobante_id = _rowdetalle.comprobante_id;
			
		IF(FOUND)THEN
			_descuento := _row.descuento;
			_importe_bruto := (_row.importe_bruto - _rowdetalle.precio_total);

			IF(_row.precios_incluyen_igv)THEN
				_precio_venta := _importe_bruto - _descuento;
				_valor_venta := _precio_venta / (1+ (_row.val_igv/100));
			ELSE
				_valor_venta := _importe_bruto - _descuento;
				_precio_venta := _valor_venta * (1+ (_row.val_igv/100));
			END IF;
		
			_impuesto :=  _precio_venta - _valor_venta;

			UPDATE pca_ventas.comprobantes SET
				importe_bruto = _importe_bruto,
				valor_venta = _valor_venta,
				impuesto = _impuesto,
				precio_venta = _precio_venta
			WHERE
				comprobante_id = _rowdetalle.comprobante_id;

			DELETE FROM pca_ventas.detalles_comprobante WHERE detalle_id = $1;
		ELSE
			RAISE EXCEPTION 'Error al consultar informacion del comprobante';
		END IF;
	ELSE
		RAISE EXCEPTION 'No existe detalle con ID = %',$1;
	END IF;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_ventas.fn_move_down_detalle(bigint --detalle_id $1
							   )RETURNS void AS
$$
DECLARE
	_row pca_ventas.detalles_comprobante%ROWTYPE;
BEGIN
	SELECT
		*
	INTO
		_row
	FROM
		pca_ventas.detalles_comprobante
	WHERE
		detalle_id = $1;

	IF(FOUND)THEN
		UPDATE pca_ventas.detalles_comprobante SET correlativo = _row.correlativo WHERE correlativo = (_row.correlativo + 1) AND comprobante_id = _row.comprobante_id;
		UPDATE pca_ventas.detalles_comprobante SET correlativo = _row.correlativo + 1 WHERE detalle_id = $1;
	ELSE
		RAISE EXCEPTION 'No existe detalle con ID = %',$1;
	END IF;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_ventas.fn_move_up_detalle(bigint --detalle_id $1
							 )RETURNS void AS
$$
DECLARE
	_row pca_ventas.detalles_comprobante%ROWTYPE;
BEGIN
	SELECT
		*
	INTO
		_row
	FROM
		pca_ventas.detalles_comprobante
	WHERE
		detalle_id = $1;

	IF(FOUND)THEN
		UPDATE pca_ventas.detalles_comprobante SET correlativo = _row.correlativo WHERE correlativo = (_row.correlativo-1) AND comprobante_id = _row.comprobante_id;
		UPDATE pca_ventas.detalles_comprobante SET correlativo = _row.correlativo -1 WHERE detalle_id = $1;
	ELSE
		RAISE EXCEPTION 'No existe detalle con ID = %',$1;
	END IF;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_ventas.fn_get_list_detalle(bigint --comprobante_id $1
							  )RETURNS SETOF pca_ventas.detalles_comprobante AS
$$
DECLARE
	_row pca_ventas.detalles_comprobante%ROWTYPE;
BEGIN
	FOR _row IN
		SELECT
			detalle_id,
			sesion_id,
			comprobante_id,
			correlativo,
			articulo_id,
			codigo,
			cantidad,
			medida,
			descripcion,
			precio_unitario,
			precio_costo,
			precio_total
		FROM
			pca_ventas.detalles_comprobante
		WHERE
			comprobante_id = $1
		ORDER BY
			correlativo ASC
	LOOP
		RETURN NEXT _row;
	END LOOP;
END;
$$
LANGUAGE plpgsql;

------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------pca_ventas.vw_comprobantes_asignar-----------------------------------------------
------------------------------------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION pca_ventas.fn_get_comprobante_asignar(bigint --comprobante_id $1
								 )RETURNS pca_ventas.vw_comprobantes_asignar AS
$$
DECLARE
	_row pca_ventas.vw_comprobantes_asignar%ROWTYPE;
BEGIN
	SELECT 
		comprobante_id,
		oficina_id,
		empresa_id,
		documento_id,
		serie,
		numero,
		title,
		cliente,
		fecha_hora_emision,	
		total,
		estado_comprobante_id
	INTO
		_row
	FROM
		pca_ventas.vw_comprobantes_asignar
	WHERE
		comprobante_id =$1;

	IF(FOUND)THEN
		RETURN _row;
	ELSE
		RAISE EXCEPTION 'No existe comprobante con Id = %',$1;
	END IF;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_ventas.fn_get_list_comprobantes_asignar(integer,--start $1
								       integer,--limit $2
								       varchar,--oficina_id $3
								       varchar,--empresa_id $4
								       text -- filtro $5
								       )RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
BEGIN
	OPEN cursor_result FOR
		SELECT
			comprobante_id,
			title,
			cliente,
			fecha_hora_emision,	
			total
		FROM
			pca_ventas.vw_comprobantes_asignar
		WHERE
			estado_comprobante_id <> '00' AND
			estado_comprobante_id <> '02' AND
			oficina_id = $3 AND
			empresa_id = $4 AND
			lower(pca_global.fn_ascii(cliente)) LIKE '%'||lower(pca_global.fn_ascii($5))||'%'
		ORDER BY
			serie DESC,numero DESC LIMIT $2 OFFSET $1;
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		SELECT
			count(comprobante_id)
		FROM
			pca_ventas.vw_comprobantes_asignar
		WHERE
			estado_comprobante_id <> '00' AND
			estado_comprobante_id <> '02' AND
			oficina_id = $3 AND
			empresa_id = $4 AND
			lower(pca_global.fn_ascii(cliente)) LIKE '%'||lower(pca_global.fn_ascii($5))||'%';
	RETURN NEXT cursor_totalrows;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_ventas.fn_get_list_comprobantes_asignar(integer,--start $1
								       integer,--limit $2
								       varchar,--oficina_id $3
								       varchar,--empresa_id $4
								       varchar,--documento_id $5
								       integer,--serie $6
								       integer --numero $7
								       )RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
BEGIN
	OPEN cursor_result FOR
		SELECT
			comprobante_id,
			title,
			cliente,
			fecha_hora_emision,	
			total
		FROM
			pca_ventas.vw_comprobantes_asignar
		WHERE
			estado_comprobante_id <> '00' AND
			estado_comprobante_id <> '02' AND
			oficina_id = $3 AND
			empresa_id = $4 AND
			documento_id = $5 AND
			serie = $6 AND
			numero = $7
		ORDER BY
			serie DESC,numero DESC LIMIT $2 OFFSET $1;
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		SELECT
			count(comprobante_id)
		FROM
			pca_ventas.vw_comprobantes_asignar
		WHERE
			estado_comprobante_id <> '00' AND
			estado_comprobante_id <> '02' AND
			oficina_id = $3 AND
			empresa_id = $4 AND
			documento_id = $5 AND
			serie = $6 AND
			numero = $7;
	RETURN NEXT cursor_totalrows;
END;
$$
LANGUAGE plpgsql;
